home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / glibmm-2.4 / proc / generate_wrap_init.pl next >
Perl Script  |  2006-04-20  |  8KB  |  344 lines

  1. #! /usr/bin/perl
  2. #
  3. # tools/generate_wrap_init.pl.  Generated from generate_wrap_init.pl.in by configure.
  4. #
  5.  
  6. use strict;
  7.  
  8. my @namespace_whole = (); # list of strings.
  9. my $function_prefix = "";
  10. my $parent_dir = ""; # e.g. gtkmm
  11. my $path = "gtk--";
  12. my $debug = 0;
  13. my @filenames_headers = ();
  14. my %objects = ();
  15. my %exceptions = ();
  16. my %namespaces = (); # hashmap of lists of strings.
  17. my %basenames = ();
  18. my %win32_nowrap = ();
  19.  
  20. # Loop through command line arguments, setting variables:
  21. while ($ARGV[0] =~ /^-/)
  22. {
  23.   if ($ARGV[0] =~ /--namespace=(\S+)/)
  24.   {
  25.     push(@namespace_whole, $1);
  26.  
  27.     if($parent_dir eq "")
  28.       { $parent_dir = lc($1) . "mm"; }
  29.   }
  30.   elsif ($ARGV[0] =~ /--function_prefix=(\S+)/)
  31.   {
  32.     $function_prefix = "$1";
  33.   }
  34.   elsif ($ARGV[0] =~ /--parent_dir=(\S+)/)
  35.   {
  36.     $parent_dir = "$1";
  37.   }
  38.   elsif
  39.   (
  40.     $ARGV[0] =~ /--debug/) {$debug = 1;
  41.   }
  42.   elsif ($ARGV[0] =~ /--path=(\S+)/)
  43.   {
  44.     $path = "$1";
  45.   }
  46.   else
  47.   {
  48.     print "Error: unknown option $ARGV[0]\n";
  49.     exit;
  50.   }
  51.  
  52.   shift @ARGV;
  53. }
  54.  
  55.  
  56.  
  57. while ($ARGV[0])
  58. {
  59.   if ($debug) {warn "Processing file : $ARGV[0]\n";}
  60.  
  61.   my $filename = $ARGV[0];
  62.   open FILE, $filename or die "Couldn't open file $ARGV[0] : $!\n";
  63.  
  64.   # my $file = $ARGV[0];
  65.   # $file =~ s/.*\/([^\/]+)$/$1/;
  66.   # $file =~ s/\.hg//;
  67.   my @tmpnamespace = @namespace_whole;
  68.   my $cppname = "";
  69.   my $cname = "";
  70.   my $ccast = "";
  71.   while (<FILE>)
  72.   {
  73.     if (/CLASS_START\((\w+)\)/) #We need a new way to get the namespace.
  74.     {
  75.       print "generate_wrap_init: namespace found: $1\n";
  76.       push(@tmpnamespace, $1);
  77.     }
  78.     elsif (/_CLASS_GOBJECT\s*\(/) #TODO: There is duplication of code here.
  79.     {
  80.       my $line = $_;
  81.       while ($line !~ /\)/ && ($_ = <FILE>))
  82.       {
  83.         $line .= $_;
  84.       }
  85.  
  86.       $line =~ s/^.*_CLASS_GOBJECT\s*\(//;
  87.       $line =~ s/\s+//g;
  88.       ($cppname, $cname, $ccast) = split(/,/, $line);
  89.  
  90.       $objects{$cppname} = $cname;
  91.       @{$namespaces{$cppname}} = ( @tmpnamespace ); #both are lists of strings
  92.       $basenames{$cppname} = lc($ccast);
  93.     }
  94.     elsif (/_CLASS_GTKOBJECT\s*\(/)
  95.     {
  96.       my $line = $_;
  97.       while ($line !~ /\)/ && ($_ = <FILE>))
  98.       {
  99.         $line .= $_;
  100.       }
  101.  
  102.       $line =~ s/^.*_CLASS_GTKOBJECT\s*\(//;
  103.       $line =~ s/\s+//g;
  104.       ($cppname, $cname, $ccast) = split(/,/, $line);
  105.  
  106.       #TODO: Remove this hack eventually.
  107.       if( ($cname ne "GtkTree") && ($cname ne "GtkTreeItem") && ($cname ne "GtkText") )
  108.       {
  109.         $objects{$cppname} = $cname;
  110.         @{$namespaces{$cppname}} = ( @tmpnamespace ); #both are lists of strings
  111.         $basenames{$cppname} = lc($ccast);
  112.       }
  113.     }
  114.     elsif (/_WRAP_GERROR\s*\(/) #TODO: There is duplication of code here.
  115.     {
  116.       my $line = $_;
  117.       while ($line !~ /\)/ && ($_ = <FILE>))
  118.       {
  119.         $line .= $_;
  120.       }
  121.  
  122.       $line =~ s/^.*_WRAP_GERROR\s*\(//;
  123.       $line =~ s/\s+//g;
  124.       $line =~ s/\)//;
  125.       ($cppname, $cname, $ccast) = split(/,/, $line);
  126.  
  127.       $exceptions{$cppname} = $cname;
  128.       @{$namespaces{$cppname}} = ( @tmpnamespace ); #both are lists of strings
  129.       $basenames{$cppname} = lc($ccast);
  130.     }
  131.     elsif (/_GTKMMPROC_WIN32_NO_WRAP/)
  132.     {
  133.       $win32_nowrap{$cppname} = 1;
  134.     }
  135.   }
  136.  
  137.   # Store header filename so that we can #include it later:
  138.   my $filename_header = $filename;
  139.   $filename_header =~ s/.*\/([^\/]+)\.hg/$1.h/;
  140.   push(@filenames_headers, $filename_header);
  141.  
  142.   shift @ARGV;
  143.   close(FILE);
  144. }
  145.  
  146. # my $namespace_whole_lower = lc($namespace_whole);
  147.  
  148. print << "EOF";
  149.  
  150. #include <glib.h>
  151.  
  152. // Disable the 'const' function attribute of the get_type() functions.
  153. // GCC would optimize them out because we don't use the return value.
  154. #undef  G_GNUC_CONST
  155. #define G_GNUC_CONST /* empty */
  156.  
  157. #include <${parent_dir}/wrap_init.h>
  158. #include <glibmm/error.h>
  159. #include <glibmm/object.h>
  160.  
  161. // #include the widget headers so that we can call the get_type() static methods:
  162.  
  163. EOF
  164.  
  165. foreach( @filenames_headers )
  166. {
  167.   print "#include \"" . $_ . "\"\n";
  168. }
  169.  
  170. print "\n";
  171.  
  172. # Here we have to be subtle. The gtkmm objects are easy, they all go
  173. # into the Gtk namespace. But in gnomemm, some go into the Gnome
  174. # namespace (most of them), and some into the Gtk one (because the
  175. # corresponding widget is Gtk-prefixed, e.g. GtkTed, GtkDial, etc...
  176.  
  177. # First, the Gtk namespace
  178.  
  179. print "extern \"C\"\n";
  180. print "{\n";
  181. print "\n//Declarations of the *_get_type() functions:\n\n";
  182.  
  183. my $i = 0;
  184. foreach $i (sort keys %objects)
  185. {
  186.   #On Win32, these classes are not compiled:
  187.   if( $win32_nowrap{$i} eq 1 )
  188.   {
  189.     print "#ifndef G_OS_WIN32\n"
  190.   }
  191.   
  192.   print "GType $basenames{$i}_get_type(void);\n";
  193.   
  194.   if( $win32_nowrap{$i} eq 1 )
  195.   {
  196.     print "#endif //G_OS_WIN32\n"
  197.   }
  198. }
  199.  
  200. print "\n//Declarations of the *_error_quark() functions:\n\n";
  201.  
  202. my $i = 0;
  203. foreach $i (sort keys %exceptions)
  204. {
  205.   print "GQuark $basenames{$i}_quark(void);\n";
  206. }
  207.  
  208. print "} // extern \"C\"\n";
  209. print "\n";
  210.  
  211. print "\n//Declarations of the *_Class::wrap_new() methods, instead of including all the private headers:\n\n";
  212.  
  213. my $i = 0;
  214. foreach $i (sort keys %objects)
  215. {
  216.   #On Win32, these classes are not compiled:
  217.   if( $win32_nowrap{$i} eq 1 )
  218.   {
  219.     print "#ifndef G_OS_WIN32\n"
  220.   }
  221.   
  222.   my $namespace_declarations = "";
  223.   my $namespace_close = "";
  224.   foreach ( @{$namespaces{$i}} )
  225.   {
  226.     $namespace_declarations .= "namespace $_ { ";
  227.     $namespace_close .= " }";
  228.   }
  229.  
  230.   print "${namespace_declarations} class ${i}_Class { public: static Glib::ObjectBase* wrap_new(GObject*); }; ${namespace_close}\n";
  231.   
  232.   if( $win32_nowrap{$i} eq 1 )
  233.   {
  234.     print "#endif //G_OS_WIN32\n"
  235.   }
  236. }
  237.  
  238. # print "\n//Declarations of the *Error::throw_func() methods:\n\n";
  239. #
  240. # my $i = 0;
  241. # foreach $i (sort keys %exceptions)
  242. # {
  243. #   my $namespace_declarations = "";
  244. #   my $namespace_close = "";
  245. #   foreach ( @{$namespaces{$i}} )
  246. #   {
  247. #     $namespace_declarations .= "namespace $_ { ";
  248. #     $namespace_close .= " }";
  249. #   }
  250. #
  251. #   print "${namespace_declarations} class ${i} { public: static void throw_func(GError*); }; ${namespace_close}\n";
  252. # }
  253.  
  254. my $namespace_whole_declarations = "";
  255. my $namespace_whole_close = "";
  256. foreach( @namespace_whole )
  257. {
  258.   $namespace_whole_declarations .= "namespace " . $_ ." { ";
  259.   $namespace_whole_close = "} //" . $_ . "\n" . $namespace_whole_close;
  260. }
  261.  
  262. print "\n";
  263. print "$namespace_whole_declarations\n";
  264. print "\n";
  265. print "void " .$function_prefix . "wrap_init()\n{\n";
  266.  
  267.  
  268. # Generate namespace::wrap_init() body
  269. #
  270.  
  271. print "  // Register Error domains:\n";
  272.  
  273. foreach $i (sort keys %exceptions)
  274. {
  275.   my $namespace_prefix = "";
  276.   foreach( @{$namespaces{$i}} )
  277.   {
  278.     $namespace_prefix .= $_ ."::";
  279.   }
  280.  
  281.   print "  Glib::Error::register_domain($basenames{$i}_quark(), &", "${namespace_prefix}${i}::throw_func);\n";
  282. }
  283.  
  284. print "\n";
  285. print "// Map gtypes to gtkmm wrapper-creation functions:\n";
  286.  
  287. foreach $i (sort keys %objects)
  288. {
  289.   #On Win32, these classes are not compiled:
  290.   if( $win32_nowrap{$i} eq 1 )
  291.   {
  292.     print "#ifndef G_OS_WIN32\n"
  293.   }
  294.   
  295.   my $namespace_prefix = "";
  296.   foreach( @{$namespaces{$i}} )
  297.   {
  298.     $namespace_prefix .= $_ ."::";
  299.   }
  300.  
  301.   print "  Glib::wrap_register($basenames{$i}_get_type(), &", "${namespace_prefix}${i}_Class::wrap_new);\n";
  302.  
  303.   if( $win32_nowrap{$i} eq 1 )
  304.   {
  305.     print "#endif //G_OS_WIN32\n"
  306.   }
  307. }
  308.  
  309. print "\n";
  310. print "  // Register the gtkmm gtypes:\n";
  311.  
  312. foreach $i (sort keys %objects)
  313. {
  314.   #On Win32, these classes are not compiled:
  315.   if( $win32_nowrap{$i} eq 1 )
  316.   {
  317.     print "#ifndef G_OS_WIN32\n"
  318.   }
  319.   
  320.   my $namespace_prefix = "";
  321.   foreach( @{$namespaces{$i}} )
  322.   {
  323.     $namespace_prefix .= $_ ."::";
  324.   }
  325.  
  326.   print "  ${namespace_prefix}${i}::get_type();\n";
  327.  
  328.   if( $win32_nowrap{$i} eq 1 )
  329.   {
  330.     print "#endif //G_OS_WIN32\n"
  331.   }
  332. }
  333.  
  334. print << "EOF";
  335.  
  336. } // wrap_init()
  337.  
  338. $namespace_whole_close
  339.  
  340. EOF
  341.  
  342. exit 0;
  343.  
  344.